package com.per.mybootall.Interceptor;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;

/**
 * 通过springboot创建的aop拦截器
 * */

//这两个注解将其转变为切面类
@Component
@Aspect
public class MyNewInterceptor {
//    @Resource
//    private Redisson redisson;
    //@Around : 拦截器注解    拦截com.per.mybootall.controller包下的所有class的所有方法   [测试接口:http://localhost:8081/order/testMybitsID?userid=1]
    //@annotation:切点注入     表示匹配该注解的方法
    @Around("execution (* com.per.mybootall.controller.*.*(..))&& @annotation(com.per.mybootall.Interceptor.MyNote)")
    public Object te(ProceedingJoinPoint pjp) throws Throwable {

        //redisson的分布式锁
//        RLock rLock=redisson.getLock("te");
//        //加锁
//        rLock.lock();
//        System.out.println("这里是一大堆被锁的业务代码");
//        //解锁
//        rLock.unlock();

        //getSignature:获取当前即将执行的方法的方法签名
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        //直接获取方法的对象:getMethod
        Method method = signature.getMethod();
        //获取方法对象的注解
        MyNote lockAnnotation = method.getAnnotation(MyNote.class);

        //getArgs:目标方法参数
        final Object[] args = pjp.getArgs();
        for (Object arg : args) {

            System.out.println("**************:"+   arg.toString());
        }
        //放行
        return pjp.proceed();
    }
}
